export default {
  help: `// 帮助信息
输入以下指令可以查看对应部分的信息

// >> run js:
help code       // 可用代码
help infoStore  // 信息仓库
help cardStore  // 卡片仓库
help colorStore // 颜色仓库
help eventBus   // 事件总线

// >> cmd:
help cmd // 显示可用cmd指令

注:
1. help指令中的help可以缩写成h
2. run js模式下打印语句为consolelog()或clg()
3. run js模式下内部可执行异步代码
4. 打印内容以及错误信息会显示在编辑器下方
5. cmd模式下每次运行指令前需清空编辑器
7. run js中内置函数有:
  (1)consolelog // 打印语句,传入打印的内容,将结果打印至编辑器最下方 [可缩写成clg]
  (2)clearlog   // 清空文本,
  (3)relog      // 刷新打印,清空编辑器并打印结果
  (4)getRandom  // 随机整数,args:[min,max,[banArr]],其中banArr为可选参数,含义为不生成的数值的数组
  (5)distinct   // 数组去重,传入去重的数组,返回去重后的数组[不改变原数组]
  (6)delay      // 延时函数,传入延迟的时间
  (7)debounce   // 防抖函数,传入需要防抖的持续时间,返回处理后的防抖函数
  (8)request    // 发送请求,传入{ method, url, data, ... }
  例: consolelog("打印");`,
  cmd: `clg        // 打印, clg content
getcards   // 获取全部卡片
clearcards // 清除全部卡片 以及 关卡进度
infostore  // 调用infoStore的方法, infostore funcName arg
cardstore  // 调用cardStore的方法, cardstore funcName arg
emit       // 向事件总线中抛出一个事件, emit eventName arg
request    // 发送请求, [request get "https:xxx.xxx/xxx/xxx" {params{xxx:xxx,xxx:xxx}}]`,
  code: `help code

alert("弹窗");

consolelog("打印至编辑器窗口");

// 生成0-9中除去1,2的随机整数
getRandom(0, 9, [1,2]);

// 数组去重, 得到去重后的新函数
const newArr = distinct(arr);

// 延时一秒
await delay(1000);

// 函数防抖[一秒内不重复触发]
const newFunc = debounce(func, 1000);

// 获取卡片池的全部卡片
localStorage.setItem("myCards", "srazbacbdcedfegfhgihjikjlkmlnmonpoqprq");
this.$store.commit("cards/getCards");

// 清除卡片池的全部卡片 以及 关卡进度
this.$store.commit("cards/clearCards");
this.$store.commit("cards/getCards");
this.$store.commit("cards/getLevel");
this.$store.commit("cards/setLevelNum", 1);

// 设置关卡进度为1
this.$store.commit("cards/setLevelNum", 1); // 1-10

// 重置所有卡片的使用次数
this.$store.commit("cards/resetUseNum");

// put请求
const resp = await request.put("url", data);
consolelog(resp);

// 可不被遮挡地点击卡片
  // 再次打开命令窗口时该效果会关闭
this.$store.commit("cards/setIsCover", false);
this.$store.commit("cards/setIsShowCmd", false);
const timerId = setInterval(() => {
  this.$store.commit("cards/setIsCover", false);
  if (this.cardStore.isShowCmd) {
    this.$store.commit("cards/setIsCover", true);
    clearInterval(timerId);
  }
}, 300);

// 每2秒删除1张卡片
  // 再次打开命令窗口时该效果会关闭
const duration = 2000; // 删除卡片的时间间隔[ms]
this.$store.commit("cards/setIsShowCmd", false);
const timerId = setInterval(() => {
  if (this.infoStore.isStarted) {
    this.$store.commit(
      "info/deleteGameCard",
      this.infoStore.gameCards.length - 1
    );
    if (this.infoStore.gameCards.length === 0) {
      this.$bus.$emit("gameWin");
    }
  }
  if (this.cardStore.isShowCmd) {
    clearInterval(timerId);
  }
}, duration);

// 显示一条通知
// const h = this.$createElement; // 该语句是为了让显示内容斜体绿色, 可注释
this.$notify({
  showClose: true, // 是否显示关闭按钮
  title: "title",  // 通知标题
  // content为显示内容, 也可以只写content [当前为斜体绿色]
  message: this.$createElement("i", { style: "color: teal" }, "content"),
  position: "top-right/top-left/bottom-right/bottom-left", // 显示位置
  duration: "5000" // 显示时间
});

// 显示一个弹窗
this.$message({
  showClose: true,    // 是否显示关闭按钮
  message: "content", // 内容
  duration: 3000,     // 显示时间
  type: "success/warning/info/error", // 弹窗类型
  offset: this.infoStore.popOffset,   // 距离顶部距离 [当前为自适应]
});`,
  infoStore: `help infoStore

infoStore:
    // 读取数据: this.infoStore.varName
    // 例: this.infoStore.isStarted;
// 游戏是否已经开始 <false>
isStarted: false,
// 设备是否为移动端 <true>
isMobile: isMobile(),
// 是否是关卡模式 <false>
isLevelMode: false,
// 是否显示设置窗口 <false>
isShowSetting: false,
// 是否禁止点击卡片 <false>
isBanCardClick: false,
// 游戏是否一定有解 [是否是简单模式] <true>
isEasy: true,
// 是否开启游戏声音 <true>
isVolume: true,
// 是否使用彩色卡片 <true>
isColor: true,
// 是否显示生成动画 <true>
isAnim: true,
// 得分 <0>
score: 0,
// 游戏时间 <0>
time: 0,
// 中间弹窗距顶部的高度 <148>
popOffset: isMobile() ? 148 : 60,
// 游戏区 宽度/高度 [密排的情况下每 行/列 的最大的卡片数] <10/10>
size: {
// 卡槽容量 <6>
slotMaxNum: 6,
// 卡槽中每次消除卡片的个数 <3>
clearCard: 3,
// 卡片id [每生成一张卡片id+1, 也用于表示堆叠, 数值越大表示越靠上] <0>
cardId: 0,
// PC端卡片尺寸 <50>
cardSize: 50,
// 移动端卡片尺寸 <42>
cardSize2: 42,
// 初始卡片数 <132>
cardNum: 132,
// 选择的卡片类型 <0~10> [一共有0~17种图标]
cardTypes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
// 卡片类型的总数 [以cards中的cardData的长度为准] <18>
cardTypeTotal: 18,
// 是否降低卡片重叠的概率 <false>
isReduceOverlap: false,
// 卡片获取率
cardProb: 0.15,
// run js编辑器的内容 [文本域内容]
textarea: "",
// 是否自动添加卡片 <false>
isAutoAddCard: false,
// 自动添加卡片的时间间隔 [单位ms] <3000>
duration: 3000,
// 游戏区中所有的卡片
gameCards: [],
// 游戏区中的每一张卡片是否该显示 [对象中以cardId为键]
gameIsShowCards: {0: true,...},
// 卡槽中所有的卡片
slotCards: [],
// 卡槽中的每一张卡片是否该显示
slotIsShowCards: {5: true,...},
// 命令的数据存储区域
cmdData: {
  num1: 0,
  num2: 0,
  num3: 0,
  str1: "",
  str2: "",
  str3: "",
  arr1: [],
  arr2: [],
  arr3: [],
  obj1: {},
  obj2: {},
  obj3: {},
  fn1: "",
  fn2: "",
  fn3: "",
},
_____________________________________________________

mutations:
    // 调用: this.$store.commit("info/funcName, arg);
    // 例: this.$store.commit("info/setIsStarted, true);
// 设置游戏是否开始
setIsStarted
// 设置当前设备是否为移动端
setIsMobile
// 设置是否处在关卡模式
setIsLevelMode
// 设置设置窗口是否显示
setIsShowSetting
// 设置是否禁止点击卡片
setIsBanCardClick
// 设置是否一定有解
setIsEasy
// 设置是否开启游戏声音
setIsVolume
// 设置是否使用彩色卡片
setIsColor
// 设置是否开启生成动画
setIsAnim
// 设置游戏区的宽度
setSizeW
// 设置游戏区的高度
setSizeH
// 设置卡槽容量
setSlotMaxNum
// 设置卡槽中每次消除卡片的个数
setClearCard
// 设置卡片id
setCardId
// 设置PC端卡片尺寸
setCardSize
// 设置移动端卡片尺寸
setCardSize2
// 设置初始卡片数
setCardNum
// 设置选择的卡片类型
setCardTypes
// 设置卡片类型的总数
setCardTypeTotal
// 设置是否降低卡片重叠概率
setIsReduceOverlap
// 设置卡片获取率
setCardProb
// 设置文本域内容
setTextarea
// 设置是否自动添加卡片
setIsAutoAddCard
// 设置自动添加卡片的时间间隔
setDuration
// 设置游戏区卡片的坐标
setGameCardCoor // payload: {i:xxx, coor: {x:xxx, y:xxx}}
// 设置游戏区卡片的cardId
setGameCardCard // payload: {i:xxx, cardId: xxx}
// 设置游戏区卡片的iconId
setGameCardIcon // payload: {i:xxx, iconId: xxx}
// 设置卡槽中卡片的iconId
setSlotCardIcon // payload: {i:xxx, iconId: xxx}
// 在游戏区增加一张卡片
addGameCard // payload: {cardId: xxx, iconId: xxx, coor: {x: xxx, y: xxx}}
// 在卡槽中增加一张卡片
addSlotCard // payload: {cardId: xxx, iconId: xxx, coor: {x: xxx, y: xxx}}
// 删除游戏区的卡片
deleteGameCard // 传入要删除的索引
// 删除卡槽的卡片
deleteSlotCard // 传入要删除的索引
// 打印命令数据仓库中的变量
clg
// 设置命令仓库中的变量的值
setVar
  // {
  //   name: varName,
  //   data: xxxx,
  // }
// 设置命令仓库中的函数
setFn
  // {
  //   name: varName,
  //   fn: "function(){const arr=[];for(let i=0;i<3;i++){arr.push(i)};"
  // }
// 执行命令仓库中的一个函数
runfn
// 游戏重置
gameReset(state)`,
  cardStore: `help cardStore

cardStore:
    // 读取数据: this.cardStore.varName
    // 例: this.cardStore.isShowCurCard;
// 是否显示剩余卡片数 ['文本'] [右上角] <false>
isShowCurCard: false,
// 下次点击是否可直接修改卡片 ['铅笔'] <false>
isEdit: false,
// 要修改的卡片的对象在gameCards中的索引 以及卡片信息 {i, cardId: card.cardId}
editCard: -1,
// 下次点击的时候是否消除点击的卡片 ['购物袋'] <false>
isDelete: false,
// 下次点击时是否考虑遮挡 ['放大镜'] <true>
isCover: true,
// 下次点击时是否消除卡槽中点击的卡片 ['下载'] <false>
isSlotDelete: false,
// 下次点击时是否增加卡槽中点击的卡片 ['照相机'] <false>
isSlotAdd: false,
// 下次点击时是否消除点击区域的所有卡片 ['剪刀'] <false>
isDeleteArea: false,
// 是否跳过关卡模式前4关中的一关 ['消息'] <true>
isPass: true,
// 当前关卡时间数据是否有效 [是否使用'消息'卡片] <true>
isCanRanking: true,
// 关卡进度 <1>
levelNum: 1,
// 当前关卡的时间和计时器id <0>
levelTime: 0,
// 计时器id
levelTimerId: "",
// 是否显示命令窗口 <false>
isShowCmd: true,
// 卡片数据
cardData: {},
// 已拥有的卡片 [里面记录的是索引]
// 获取全部卡片的加密字符串: srazbacbdcedfegfhgihjikjlkmlnmonpoqprq
myCards: [],
// 未获得的卡片
notCards: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
// 未获得的卡片的默认值
notCardsDefa: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
// 加密
encryption: {0:"az",1:"ba",2:"cb",3:"dc",4:"ed",5:"fe",6:"gf",7:"hg",8:"ih",9:"ji",10:"kj",11:"lk",12:"ml",13:"nm",14:"on",15:"po",16:"qp",17:"rq",18:"sr",19:"ts",20:"ut",21:"vu",22:"wv",23:"xw",24:"yx",25:"zy"},
// 解密
decryption: {}
_____________________________________________________
mutations:
    // 调用: this.$store.commit("cards/funcName, arg);
    // 例: this.$store.commit("cards/setTsShowCurCard, fasle);
// 设置是否显示剩余卡片数
setIsShowCurCard
// 设置是否修改卡片
setIsEdit
// 设置是否消除卡片
setIsDelete
// 设置要修改的卡片的对象在gameCards中的索引 以及卡片信息 {i, cardId: card.cardId}
setEditCard
// 设置是否考虑遮挡
setIsCover
// 设置是否消除卡槽中点击的卡片
setIsSlotDelete
// 设置是否增加卡槽中点击的卡片
setIsSlotAdd
// 设置是否消除点击区域的所有卡片
setIsDeleteArea
// 设置是否跳过关卡模式前4关中任意一关
setIsPass
// 设置当前关卡时间数据是否有效
setIsCanRanking
// 设置卡片的使用次数
setCardUseNum
  // payload: {i: xxx, useNum: xxx}
// 重置所有卡片的使用次数 以及 将各变量重置为初始状态
resetUseNum(state)
// 设置关卡进度
setLevelNum
// 设置当前关卡的时间 [s]
setLevelTime
// 设置当前关卡的计时器的id
setLevelTimerId
// 设置是否显示cmd窗口
setIsShowCmd
// 将进入游戏时候的时间戳存入本地
putTime()
// 根据本地得到的上次登录的日期来刷新关卡进度
updateLevel(state)
// 增加一张卡片至仓库
addMycards
// 解密本地的卡片至仓库
getCards(state)
// 加密拥有的卡片并存入本地
putCards(state)
// 解密本地的关卡数据
getLevel(state)
// 加密当前关卡进度, 并存入本地
putLevel(state)
// 清除本地记录
clearCards()`,
  colorStore: `help colorStore

colorStore:
    // 读取数据: this.colorStore.varName
    // 例: this.colorStore.cardBg[2];
// 卡片背景色
cardBg: [
"#ffefef", // 0
"#fff4ed", // 1
"#fffcec", // 2
"#fbffec", // 3
"#f3ffeb", // 4
"#edffec", // 5
"#edfff7", // 6
"#ecfffe", // 7
"#edfbff", // 8
"#edf5ff", // 9
"#eef2ff", // 10
"#f3ecff", // 11
"#fdefff", // 12
"#ffecfb", // 13
"#ffedf5", // 14
"#ececec", // 15
"#ffffff", // 16
"#ffeff4", // 17
],`,
  eventBus: `help eventBus

事件总线:
    // this.$bus.$on("事件名", arg);   // 监听事件
    // this.$bus.$off("事件名", arg);  // 取消监听
    // this.$bus.$emit("事件名", arg); // 抛出事件

事件1: gameCardClick
含义: 游戏区的卡片被点击后触发
参数:
- data: {
  cardId: xxx,
  iconId: xxx,
  coor: { x: xxx, y: xxx },
}

事件2: gameStart
含义: 游戏开始时触发

事件3: gameOver
含义: 游戏失败时触发

事件4: gameWin
含义: 游戏胜利时触发

事件5: successClick
含义: 成功点击时触发
参数:
- data: {
  cardId: xxx,
  iconId: xxx,
  coor: { x: xxx, y: xxx },
  voice: xxx, // 成功点击后的音效 [导入音频后的变量]
}

事件6: clearCards
含义: 卡片消除时触发
参数:
- data: {
  voice: xxx,
}

事件7: clickSetting
含义: 点击设置时触发

事件8: clickCardPool
含义: 点击卡片池时触发

事件9: levelModeSuccess
含义: 过关时触发

事件10: levelModeStart
含义: 每次关卡模式开始时触发`,
  axiosRequ: `// axios请求测试 [put请求users]

async function setUsers(data) {
  return await request.put("https://game-two-1310591936.cos.ap-nanjing.myqcloud.com/data/users.json", data);
}
try {
  const resp = await setUsers([{userName:"axiosTest",pwx:"xxxxxx"}]);
  consolelog(resp,resp.status);
} catch(err) {
  consolelog(err);
}`,
  fetchRequ: `// fetch请求测试 [put请求users]

async function fetchRequ(obj) {
  // { method, url, data, token };
  try {
    const resp = await fetch(
      "https://game-two-1310591936.cos.ap-nanjing.myqcloud.com" + obj.url,
      {
        method: obj.method,
        headers: {
          Authorization: obj.token
            ? obj.token
            : token[obj.method][obj.url.split("/")[2].split(".")[0]], // 获取文件名 [无后缀]
          "Content-Type": "application/json",
        },
        body: JSON.stringify(obj.data),
      }
    );
    const data = {};
    data.status = resp.status; // 状态码
    data.data = await resp.text(); // 响应体
    return data;
  } catch (err) {
    return err;
  }
}
const resp = await fetchRequ({
  method: "put",
  url: "/data/users.json",
  data: [{userName:"fetchTest",pwd:"xxxxxx"}],
  token:
    "q-sign-algorithm=sha1&q-ak=AKID4wYv2tUu5zd0qPilY5LL6aomTv72h6F8&q-sign-time=1664186497;1689190097&q-key-time=1664186497;1689190097&q-header-list=&q-url-param-list=&q-signature=2841b0ee5397966b53e70ac33d0ac8d346e355da",
});
consolelog(resp);
`,
};
